package com.coderising.litestruts;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ReflectionUtil {

	public static List<Method> getSetterMethods(Class<?> clz) {
		
		return getMethods(clz,"set");
	}

	public static void setParameters(Object o, Map<String, String> params) {
		
		List<Method> methods=getSetterMethods(o.getClass());
		
		for(String name:params.keySet())
		{
			String methodName="set"+name;
			for(Method m:methods)
			{
				if(m.getName().equalsIgnoreCase(methodName))
				{
					try{
						m.invoke(o, params.get(name));
					}catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException e)
					{
						e.printStackTrace();
					}
				}
			}
		}
	}

	public static List<Method> getGetterMethods(Class<?> clz) {
		return getMethods(clz,"get");
	}
	
	public static List<Method> getMethods(Class<?> clz,String startWithName)
	{
		List<Method> methods=new ArrayList<>();
		for(Method m:clz.getDeclaredMethods())
		{
			if(m.getName().startsWith(startWithName))
			{
				methods.add(m);
			}
		}
		return methods;
	}

	public static Map<String, Object> getParamterMap(Object o) {
	    Map<String,Object> params=new HashMap<>();
	    
	    List<Method> methods=getGetterMethods(o.getClass());
	    
	    for(Method m:methods)
	    {
	    	String methodName=m.getName();
	    	String name=methodName.replaceFirst("get","").toLowerCase();
	    	try{
	    		Object value=m.invoke(o);
	    		params.put(name, value);
	    	}catch(Exception e)
	    	{
	    		e.printStackTrace();
	    	}
	    }
		return params;
	}

}
